/**
 * 给定一个仅包含数字 2-9 的字符串，返回所有它能表示的字母组合。
 * 给出数字到字母的映射如下（与电话按键相同）。注意 1 不对应任何字母。
 */


/**
* @param {string} digits
* @return {string[]}
*/
// function fin(str) {
//     // 先定义映射关系
//     let map = {
//         "2": "abc",
//         "3": "def",
//         "4": "ghi",
//         "5": 'jkl',
//         '6': 'mno',
//         '7': 'pqrs',
//         '8': 'tuv',
//         '9': 'wxyz'
//     }
//     let result=['']
//     for(let i =0; i< str.length; i++) {
//         // 每一次创建一个新的[]
//         let curResult = []
//
//         for(let c of map[str[i]]){
//             for(let r of result ) {
//                 curResult.push(r + c +'')
//             }
//         }
//         result = curResult
//     }
//     console.log(result);
//     return result
// }
//
// fin('89')
//
//
//
// function allSort(str){
//     let map = {
//         "2": "abc",
//         "3": "def",
//         "4": "ghi",
//         "5": 'jkl',
//         '6': 'mno',
//         '7': 'pqrs',
//         '8': 'tuv',
//         '9': 'wxyz'
//     }
//     let res = ['']
//
//     for(let i = 0; i< str.length; i++) {
//         let curRes = []
//         for(let c of map[str[i]]){
//             for(let r of res){
//                 curRes.push(c + r + '')
//             }
//         }
//        res =  curRes
//     }
//     console.log(res);
//     return res
// }
//
// allSort('23')
//
// function getResult(arr) {
//     if (!Array.isArray(arr)) return
//     let res = []
//     for (let i = 0; i < arr.length; i++) {
//         res[i] = []
//     }
// }
//
// var letterCombinations = function (digits) {
//     // 先定义映射关系
//     let map = {
//         "2": "abc",
//         "3": "def",
//         "4": "ghi",
//         "5": 'jkl',
//         '6': 'mno',
//         '7': 'pqrs',
//         '8': 'tuv',
//         '9': 'wxyz'
//     }
//
//     if (!digits.length) return
//     let res = []
//     let result = []
//     // 假设输入‘23’
//     for (let i = 0; i < digits.length; i++) {
//         res[i] = []
//         const obj = map[digits[i]] // 'abc'
//         res[i].push(obj)
//     }
//     for (let i = 0; i < res.length; i++) { // a, b, c
//         for (let j = 0; j < res[i].length; j++) {
//             result.push(res[i][i] + res[i][j] + '')
//         }
//     }
//     return result
// };
//
//
// const res = letterCombinations('23')
// console.log(res);
//
//
//
// function letterCombinations1(digits) {
//     // 先定义映射关系
//     let map = {
//         "2": "abc",
//         "3": "def",
//         "4": "ghi",
//         "5": 'jkl',
//         '6': 'mno',
//         '7': 'pqrs',
//         '8': 'tuv',
//         '9': 'wxyz'
//     }
//
//     let res = []
//     for (let i = 0; i < digits.length; i++) {
//         res[i] = []
//         for (let j = 0; j < map[digits[i]].length; j++) {
//             res[i].push(map[digits[i]][j])
//         }
//         for (let i = 0; i < res[i].length; i++) {
//             // for(let j=0; j<)
//         }
//     }
//     console.log(res);
//     return res
// }
// // letterCombinations1('23')
//
//
//
// function all() {
//     let arr1 = [1, 2, 3, 4]
//     let arr2 = ['a', 'b', 'c']
//
//     let res = []
//     for (let i = 0; i < arr1.length; i++) {
//         for (let j = 0; j < arr2.length; j++) {
//             res.push(arr1[i] + arr2[j] + '')
//         }
//     }
//     console.log(res);
//     return res
// }
// // all()
//
// function allByArr() {
//     let arr = [[1, 2, 3, 4], ['a', 'b', 'c']]
//     let res = [""]
//
//     // for(let  i= 0; i< arr.length; i++) {
//     //     // 每一次都晴空
//     //     let nextResult = []
//     //     for(let arr of arr[i]) {
//     //         for(let item of arr ) {
//
//     //         }
//     //     }
//     // }
//
// }
//
// // allByArr()
//
//
// var letterCombinations = function (digits) {
//     if (!digits) { return []; }
//     const strMap = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"];
//     let result = [""];  //初始化一个空字符，方便后续遍历
//     for (let num of digits) {   //遍历输入的数字
//         // "2"
//         let curResult = [];
//         let str = strMap[num];     //找到数字可能对应的字符
//         // "abc"
//         for (let t of result) {     //遍历上一循环生成的字符串列表
//             // ""
//             // ""a
//             for (let s of str) {    //遍历当前数字可能对应的字符
//                 // a b  c
//                 // a b c
//                 curResult.push(t + s);     //拼接字符串
//                 // ""a, ""b, ""c
//                 // ""a, ""b, ""c
//                 // aa, ab, ac
//             }
//         }
//         result = curResult;    //替换原字符串列表
//         // ""a,  ""b, ""c
//     }
//     return result;
// };

// const res11 = letterCombinations('23')
// console.log(res11);



let map = {
    "2": "abc",
    "3": "def",
    "4": "ghi",
    "5": 'jkl',
    '6': 'mno',
    '7': 'pqrs',
    '8': 'tuv',
    '9': 'wxyz'
}


function allSortV3(str){
    let arr= str.split('')
    const targetArr= []
    for(let i=0; i<str.length; i++) {
        targetArr.push([...map[str[i]]])
    }

    const res = []
    DFS([])


    function DFS(nums) {
        // 如果达到叶子
        if(nums.length ===str.length){
            res.push([...nums])
        }
        // 没有到达叶子
        for (let i=0; i<str.length; i++) {
            if(nums.includes(str[i])){
                continue;
            }
            nums.push(str[i])
            DFS([nums])
            nums.pop()
        }
    }
    return res
}

allSortV3('23')
